package com.ruoyi.web.sso.util;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.*;

public class CopyUtils {
	
	    public static String[] getNullPropertyNames (Object source) {
	        final BeanWrapper src = new BeanWrapperImpl(source);
	        PropertyDescriptor[] pds = src.getPropertyDescriptors();

	        Set<String> emptyNames = new HashSet<String>();
	        for(PropertyDescriptor pd : pds) {
	            Object srcValue = src.getPropertyValue(pd.getName());
	            if (srcValue == null) emptyNames.add(pd.getName());
	        }
	        String[] result = new String[emptyNames.size()];
	        return emptyNames.toArray(result);
	    }

		public static void copyPropertiesSkipNullAndExternalProperties(Object src, Object target, String[] external) {
	    	String[] nullProperties = getNullPropertyNames(src);
			String[] skips = ArrayUtils.addAll(nullProperties, external);
			BeanUtils.copyProperties(src, target, skips);
		}

	    public static void copyProperties(Object src, Object target) {
	        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
	    }
	    
	    public static < S,T> void copyListProperties(List<S> srcList, List<T> targetList,Class<T> targetClass) throws InstantiationException, IllegalAccessException  {
	    	if(CollectionUtils.isEmpty(srcList) ){
	    		return ;
	    	}
	    	for(S s:srcList){
	    		T target=targetClass.newInstance();
	    		BeanUtils.copyProperties(s, target, getNullPropertyNames(s));
	    		targetList.add(target);
	    	}
	    }
	    
	    
	    
	    
	    /**
	     * bean to map
	     * @param obj
	     * @return
	     */
	    public static Map<String, Object> transBean2Map(Object obj) {
	        if(obj == null){
	            return null;
	        }        
	        Map<String, Object> map = new HashMap<String, Object>();
	        try {
	            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
	            for (PropertyDescriptor property : propertyDescriptors) {
	                String key = property.getName();

	                // 过滤class属性
	                if (!key.equals("class") && !key.equals("hibernateLazyInitializer")) {
	                    // 得到property对应的getter方法
	                    Method getter = property.getReadMethod();
	                    Object value = getter.invoke(obj);

	                    map.put(key, value);
	                }

	            }
	        } catch (Exception e) {
	        }
	        return map;
	    }
	    
	    
	    public static void transMap2Bean(Map<String, Object> map, Object obj) {

	        try {
	            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

	            for (PropertyDescriptor property : propertyDescriptors) {
	                String key = property.getName();

	                if (map.containsKey(key)) {
	                    Object value = map.get(key);
	                    // 得到property对应的setter方法
	                    Method setter = property.getWriteMethod();
	                    setter.invoke(obj, value);
	                }

	            }

	        } catch (Exception e) {
	            System.out.println("transMap2Bean Error " + e);
	        }

	        return;

	    }  
	    
	    
	    
	    
	}

